class Sizer(with_metaclass(MetaParams, object)):
    '''这是*Sizers*的基类。任何*sizer*都应该继承这个类并重写``_getsizing``方法

    成员属性:

      - ``strategy``: 将由sizer所在的策略设置

        提供了策略的整个api，例如如果在``_getsizing``中需要实际数据位置::

           position = self.strategy.getposition(data)

      - ``broker``: 将由sizer所在的策略设置

        提供了一些复杂的sizer可能需要的信息，如组合价值等。
    '''

    def _getsizing(self, comminfo, cash, data, isbuy):
        '''这个方法必须被Sizer的子类重写，以提供大小调整功能

        参数:
          - ``comminfo``: 包含有关数据佣金的CommissionInfo实例，允许计算仓位价值、操作成本、操作佣金

          - ``cash``: *broker*中当前可用现金

          - ``data``: 操作的目标

          - ``isbuy``: 对于*buy*操作将为``True``，对于*sell*操作将为``False``

        该方法必须返回要执行的实际大小（一个整数）。如果返回``0``，则不会执行任何操作。

        将使用返回值的绝对值

        '''

class FixedSize(bt.Sizer):
    '''
    这个Sizer为任何操作返回一个固定的大小。
    可以通过指定“tranches”参数来控制大小，以便系统希望使用多少个tranches来缩放交易。

    参数：
      - “stake”（默认值：“1”）
      - “tranches”（默认值：“1”）
    '''

class FixedReverser(bt.Sizer):
    '''
    这个Sizer返回需要反转开放头寸或打开一个头寸的固定大小

      - 打开头寸：返回参数“stake”

      - 反转头寸：返回2 * “stake”

    参数：
      - “stake”（默认值：“1”）
    '''

class FixedSizeTarget(bt.Sizer):
    '''
    这个Sizer简单地返回一个固定的目标大小，与目标订单一起使用时非常有用，特别是“cerebro.target_order_size()”。
    可以通过指定“tranches”参数来控制大小，以便系统希望使用多少个tranches来缩放交易。

    参数：
      - “stake”（默认值：“1”）
      - “tranches”（默认值：“1”）
    '''


class PercentSizer(bt.Sizer):
    '''这个Sizer返回可用现金的百分比

    参数：
      - ``percents`` (默认值：``20``)
    '''


class AllInSizer(PercentSizer):
    '''这个Sizer返回经纪人所有可用现金

    参数：
      - ``percents`` (默认值：``100``)
    '''



class PercentSizerInt(PercentSizer):
    '''这个Sizer返回可用现金的百分比，以整数形式返回大小

    参数：
      - ``percents`` (默认值：``20``)
    '''


class AllInSizerInt(PercentSizerInt):
    '''这个Sizer返回经纪人所有可用现金，大小截断为整数

    参数：
      - ``percents`` (默认值：``100``)
    '''



